#ifndef DTU_MODBUS_POLL_H
#define DTU_MODBUS_POLL_H

#include "dtu_common.h"

/* Modbus设备配置结构（基于轮询字符串） */
typedef struct {
    int id;                          /* 设备ID */
    char name[64];                   /* 设备名称 */
    bool enabled;                    /* 是否启用 */
    bool crc_enable;                 /* CRC校验使能 */
    char poll_string[256];           /* 轮询字符串(16进制) */
    char serial_port[16];            /* 串口名称(rs485/rs232) */
    char description[128];           /* 设备描述 */
} modbus_device_config_t;

/* 轮询结果结构 */
typedef struct {
    int device_id;                   /* 设备ID */
    char device_name[64];            /* 设备名称 */
    uint8_t request_data[256];       /* 请求数据 */
    size_t request_length;           /* 请求数据长度 */
    uint8_t response_data[256];      /* 响应数据 */
    size_t response_length;          /* 响应数据长度 */
    bool success;                    /* 是否成功 */
    char error_message[128];         /* 错误信息 */
    time_t timestamp;                /* 时间戳 */
} modbus_poll_result_t;

/**
 * @brief 将16进制字符串转换为字节数组
 * @param hex_string 16进制字符串
 * @param bytes 输出字节数组
 * @param max_bytes 最大字节数
 * @return 转换的字节数，失败返回-1
 */
int dtu_hex_string_to_bytes(const char* hex_string, uint8_t* bytes, size_t max_bytes);

/**
 * @brief 将字节数组转换为16进制字符串
 * @param bytes 字节数组
 * @param byte_count 字节数
 * @param hex_string 输出16进制字符串
 * @param max_string_len 最大字符串长度
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_bytes_to_hex_string(const uint8_t* bytes, size_t byte_count, 
                                    char* hex_string, size_t max_string_len);

/**
 * @brief 处理轮询字符串，添加CRC校验
 * @param poll_string 原始轮询字符串(16进制)
 * @param crc_enable 是否启用CRC
 * @param output_bytes 输出字节数组
 * @param max_output_bytes 最大输出字节数
 * @return 输出字节数，失败返回-1
 */
int dtu_process_poll_string(const char* poll_string, bool crc_enable, 
                           uint8_t* output_bytes, size_t max_output_bytes);

/**
 * @brief 执行Modbus轮询
 * @param device_config 设备配置
 * @param response_data 响应数据缓冲区
 * @param max_response_len 最大响应长度
 * @return 响应数据长度，失败返回-1
 */
int dtu_execute_modbus_poll(const modbus_device_config_t* device_config, 
                           uint8_t* response_data, size_t max_response_len);

/**
 * @brief 验证16进制字符串格式
 * @param hex_string 16进制字符串
 * @return true 有效，false 无效
 */
bool dtu_validate_hex_string(const char* hex_string);

/**
 * @brief 格式化轮询字符串显示
 * @param poll_string 轮询字符串
 * @param formatted_output 格式化输出缓冲区
 * @param max_output_len 最大输出长度
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_format_poll_string(const char* poll_string, char* formatted_output, size_t max_output_len);

/**
 * @brief 从配置中获取设备配置
 * @param device_id 设备ID
 * @param device_config 输出设备配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_get_device_config(int device_id, modbus_device_config_t* device_config);

/**
 * @brief 更新设备配置
 * @param device_id 设备ID
 * @param device_config 设备配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_update_device_config(int device_id, const modbus_device_config_t* device_config);

/**
 * @brief 获取所有设备配置
 * @param device_configs 输出设备配置数组
 * @param max_devices 最大设备数
 * @return 实际设备数，失败返回-1
 */
int dtu_get_all_device_configs(modbus_device_config_t* device_configs, int max_devices);

#endif /* DTU_MODBUS_POLL_H */
